/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.com.hardcodeando.ui;

import ar.com.hardcodeando.ui.utils.OperacionMd5Dialog;
import ar.com.hardcodeando.ui.utils.Ronda4Dialog;
import ar.com.hardcodeando.ui.utils.Ronda3Dialog;
import ar.com.hardcodeando.ui.utils.Ronda2Dialog;
import ar.com.hardcodeando.ui.utils.Ronda1Dialog;
import ar.com.hardcodeando.algorithm.MD5;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;

/**
 *
 * @author estefi
 */
public class MD5Panel extends javax.swing.JPanel {

    /**
     * Creates new form MD5Panel
     */
    public MD5Panel() {
        initComponents();
        MD5TabbedPane1.setEnabledAt(1, false);
        MD5TabbedPane1.setEnabledAt(2, false);
        MD5TabbedPane1.setEnabledAt(3, false);
        MD5TabbedPane1.setEnabledAt(4, false);
        MD5TabbedPane1.setEnabledAt(5, false);
        MD5TabbedPane1.setEnabledAt(6, false);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        MD5TabbedPane1 = new javax.swing.JTabbedPane();
        IntroMD5 = new javax.swing.JPanel();
        comenzarIntro = new javax.swing.JButton();
        jLabel7 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        jLabel15 = new javax.swing.JLabel();
        panelPaso1 = new javax.swing.JPanel();
        labelTextoHeader = new javax.swing.JLabel();
        labelConvertirMensajeABin = new javax.swing.JLabel();
        siguientePaso1 = new javax.swing.JButton();
        labelInformativoPaso1 = new javax.swing.JLabel();
        messageWithAditionalBits = new javax.swing.JLabel();
        messageToBinary = new javax.swing.JLabel();
        textMensaje = new javax.swing.JTextField();
        labelIntroducirMensaje = new javax.swing.JLabel();
        botonTextoABinario = new javax.swing.JButton();
        botonAdicionarBits = new javax.swing.JButton();
        labelAdicionarBits = new javax.swing.JLabel();
        panelPaso2 = new javax.swing.JPanel();
        jLabel32 = new javax.swing.JLabel();
        jLabel34 = new javax.swing.JLabel();
        siguientePaso2 = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        adicionarLongitud = new javax.swing.JButton();
        jLabel33 = new javax.swing.JLabel();
        panelPaso3 = new javax.swing.JPanel();
        jLabel14 = new javax.swing.JLabel();
        jLabel28 = new javax.swing.JLabel();
        siguientePaso3 = new javax.swing.JButton();
        jLabel64 = new javax.swing.JLabel();
        jLabel68 = new javax.swing.JLabel();
        jLabel70 = new javax.swing.JLabel();
        jLabel71 = new javax.swing.JLabel();
        jLabel35 = new javax.swing.JLabel();
        jLabel72 = new javax.swing.JLabel();
        jLabel73 = new javax.swing.JLabel();
        jLabel74 = new javax.swing.JLabel();
        jLabel75 = new javax.swing.JLabel();
        panelPaso4i = new javax.swing.JPanel();
        jLabel17 = new javax.swing.JLabel();
        jLabel76 = new javax.swing.JLabel();
        jLabel69 = new javax.swing.JLabel();
        jLabel77 = new javax.swing.JLabel();
        jLabel78 = new javax.swing.JLabel();
        jLabel79 = new javax.swing.JLabel();
        jLabel81 = new javax.swing.JLabel();
        jLabel82 = new javax.swing.JLabel();
        siguientePaso4i = new javax.swing.JButton();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        panelPaso4ii = new javax.swing.JPanel();
        jLabel26 = new javax.swing.JLabel();
        jLabel19 = new javax.swing.JLabel();
        jLabel16 = new javax.swing.JLabel();
        buttonRonda1 = new javax.swing.JButton();
        buttonRonda2 = new javax.swing.JButton();
        buttonRonda3 = new javax.swing.JButton();
        buttonRonda4 = new javax.swing.JButton();
        salidaFinal = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        jLabel20 = new javax.swing.JLabel();
        jLabel21 = new javax.swing.JLabel();
        jLabel22 = new javax.swing.JLabel();
        jLabel23 = new javax.swing.JLabel();
        jRadioButton2 = new javax.swing.JRadioButton();
        jRadioButton3 = new javax.swing.JRadioButton();
        jRadioButton4 = new javax.swing.JRadioButton();
        jLabel30 = new javax.swing.JLabel();
        jLabel31 = new javax.swing.JLabel();
        siguientePaso4ii = new javax.swing.JButton();
        jRadioButton5 = new javax.swing.JRadioButton();
        valoresLabel = new javax.swing.JLabel();
        valoresIniciales = new javax.swing.JLabel();
        jLabel36 = new javax.swing.JLabel();
        labelSumaFinal = new javax.swing.JLabel();
        jLabel37 = new javax.swing.JLabel();
        jLabel38 = new javax.swing.JLabel();
        jLabel39 = new javax.swing.JLabel();
        jLabel40 = new javax.swing.JLabel();
        jLabel41 = new javax.swing.JLabel();
        jLabel42 = new javax.swing.JLabel();
        jLabel43 = new javax.swing.JLabel();
        jLabel44 = new javax.swing.JLabel();
        jLabel45 = new javax.swing.JLabel();
        jLabel46 = new javax.swing.JLabel();
        jLabel47 = new javax.swing.JLabel();
        jLabel48 = new javax.swing.JLabel();
        jLabel49 = new javax.swing.JLabel();
        jLabel50 = new javax.swing.JLabel();
        jLabel51 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        panelPaso5 = new javax.swing.JPanel();
        jLabel25 = new javax.swing.JLabel();
        jLabel29 = new javax.swing.JLabel();
        jLabel24 = new javax.swing.JLabel();
        sumaSalidaFinal = new javax.swing.JLabel();
        jLabel18 = new javax.swing.JLabel();
        hashSalida = new javax.swing.JLabel();
        variablesEntrada = new javax.swing.JLabel();
        variablesSalida = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel13 = new javax.swing.JLabel();
        jLabel27 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();

        setPreferredSize(new java.awt.Dimension(1024, 1000));
        setLayout(null);

        MD5TabbedPane1.setFocusable(false);
        MD5TabbedPane1.setPreferredSize(new java.awt.Dimension(846, 519));

        IntroMD5.setMinimumSize(new java.awt.Dimension(0, 0));
        IntroMD5.setPreferredSize(new java.awt.Dimension(80, 379));
        IntroMD5.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        comenzarIntro.setText("Comenzar");
        comenzarIntro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comenzarIntroActionPerformed(evt);
            }
        });
        IntroMD5.add(comenzarIntro, new org.netbeans.lib.awtextra.AbsoluteConstraints(630, 350, 100, -1));

        jLabel7.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel7.setText("Introducción");
        IntroMD5.add(jLabel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 10, -1, -1));

        jLabel12.setText("<html>MD5 procesa mensajes de cualquier longitud (longitud variable) y procesa bloques uniformes de 512 bits a la vez, hasta concluir con el mensaje total a fin de entregar a la salida un bloque \"resumen\" de 128 bits (longitud fija). El procesamiento consta de cinco pasos:</html>");
        IntroMD5.add(jLabel12, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 70, 1000, -1));

        jLabel15.setText("<html><strong>Paso 1</strong>: Adición de bits<br><br> <strong>Paso 2</strong>: Adición de longitud del mensaje<br><br> <strong>Paso 3</strong>: Inicialización del buffer<br><br> <strong>Paso 4</strong>: Procesamiento del mensaje en bloques de 16 palabras<br><br><strong>Paso 5</strong>: Obtención del hash de salida<br><br></html>");
        jLabel15.setDoubleBuffered(true);
        IntroMD5.add(jLabel15, new org.netbeans.lib.awtextra.AbsoluteConstraints(60, 120, 420, 190));

        MD5TabbedPane1.addTab("Introducción", IntroMD5);

        panelPaso1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        labelTextoHeader.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        labelTextoHeader.setText("Paso 1: Adición de bits");
        panelPaso1.add(labelTextoHeader, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 10, -1, -1));

        labelConvertirMensajeABin.setText("<html> <ul> <li>Convertimos el mensaje a su valor binario.</li> </ul> </html>");
        panelPaso1.add(labelConvertirMensajeABin, new org.netbeans.lib.awtextra.AbsoluteConstraints(510, 170, 390, 50));

        siguientePaso1.setText("Siguiente");
        siguientePaso1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                siguientePaso1MousePressed(evt);
            }
        });
        siguientePaso1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                siguientePaso1ActionPerformed(evt);
            }
        });
        panelPaso1.add(siguientePaso1, new org.netbeans.lib.awtextra.AbsoluteConstraints(690, 500, 100, -1));

        labelInformativoPaso1.setText("<html> A modo de ejemplo, supongamos que queremos encriptar un mensaje menor a 512 caracteres. Si el mensaje fuera más largo, el algoritmo parte el mensaje en bloques de 512 y trabaja por bloques</html>");
        panelPaso1.add(labelInformativoPaso1, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 40, 1000, 40));

        messageWithAditionalBits.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.highlight"));
        messageWithAditionalBits.setVerticalAlignment(javax.swing.SwingConstants.TOP);
        panelPaso1.add(messageWithAditionalBits, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 320, 440, 230));

        messageToBinary.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.highlight"));
        messageToBinary.setMaximumSize(new java.awt.Dimension(450, 70));
        messageToBinary.setPreferredSize(new java.awt.Dimension(450, 70));
        panelPaso1.add(messageToBinary, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 150, 450, 110));

        textMensaje.setText("TOP SECRET MESSAGE");
        textMensaje.setToolTipText("");
        textMensaje.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                textMensajeActionPerformed(evt);
            }
        });
        panelPaso1.add(textMensaje, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 110, 220, -1));

        labelIntroducirMensaje.setText("Introduzca un mensaje a encriptar:");
        panelPaso1.add(labelIntroducirMensaje, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 90, -1, -1));

        botonTextoABinario.setText("Texto a Binario");
        botonTextoABinario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonTextoABinarioActionPerformed(evt);
            }
        });
        panelPaso1.add(botonTextoABinario, new org.netbeans.lib.awtextra.AbsoluteConstraints(290, 120, -1, -1));

        botonAdicionarBits.setText("Adicionar bits");
        botonAdicionarBits.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAdicionarBitsActionPerformed(evt);
            }
        });
        panelPaso1.add(botonAdicionarBits, new org.netbeans.lib.awtextra.AbsoluteConstraints(290, 270, -1, -1));

        labelAdicionarBits.setText("<html> <ul> <li>Se rellena el mensaje binario con 0's y 1's de tal manera que sea 448 mod 512 bits de longitud.<br></li><br><li> Necesitaremos \"448 - LongitudMensaje\" bits para completar los 448.</li><br><li> Completamos la primer posición con el valor 1 y las restantes las completamos con ceros. </li> </ul></html>");
        panelPaso1.add(labelAdicionarBits, new org.netbeans.lib.awtextra.AbsoluteConstraints(510, 320, 400, 140));

        MD5TabbedPane1.addTab("Paso 1 de 5", panelPaso1);

        panelPaso2.setLayout(null);

        jLabel32.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel32.setText("Paso 2: Adición de longitud del mensaje");
        panelPaso2.add(jLabel32);
        jLabel32.setBounds(21, 12, 404, 22);

        jLabel34.setText("<html> <ul> <li>Se concatena al resultado del paso anterior, un entero de 64 bits que represente la longitud 'b' del mensaje (longitud antes de añadir los bits). </li> <br><li>Si 'b' es mayor que 2^64, entonces sólo se usarán los 64 bits de menor peso de 'b'</li><br><li>El mensaje resultante (después de rellenar con los bits y con 'b') tiene una longitud que es un múltiplo exacto de 512 bits.</li><br><li>A su vez, la longitud del mensaje es múltiplo de 16 palabras (32 bits por palabra)</li></ul> </html>");
        panelPaso2.add(jLabel34);
        jLabel34.setBounds(510, 150, 510, 244);

        siguientePaso2.setText("Siguiente");
        siguientePaso2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                siguientePaso2MousePressed(evt);
            }
        });
        panelPaso2.add(siguientePaso2);
        siguientePaso2.setBounds(710, 450, 100, 29);

        jLabel6.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.highlight"));
        panelPaso2.add(jLabel6);
        jLabel6.setBounds(20, 150, 430, 290);

        adicionarLongitud.setText("Adición Longitud");
        adicionarLongitud.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                adicionarLongitudActionPerformed(evt);
            }
        });
        panelPaso2.add(adicionarLongitud);
        adicionarLongitud.setBounds(360, 90, 140, 29);

        jLabel33.setText("Necesitaremos almacenar la longitud del mensaje original:");
        panelPaso2.add(jLabel33);
        jLabel33.setBounds(20, 50, 410, 20);

        MD5TabbedPane1.addTab("Paso 2 de 5", panelPaso2);

        panelPaso3.setPreferredSize(new java.awt.Dimension(640, 860));
        panelPaso3.setLayout(null);

        jLabel14.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel14.setText("Paso 3: Inicialización del búffer");
        panelPaso3.add(jLabel14);
        jLabel14.setBounds(30, 12, 317, 22);

        jLabel28.setText("<html>Estas variables son llamadas variables de concatenación o de encadenamiento y se almacenan en formato little-endian de manera que aparecen:</html>");
        panelPaso3.add(jLabel28);
        jLabel28.setBounds(30, 220, 930, 30);

        siguientePaso3.setText("Siguiente");
        siguientePaso3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                siguientePaso3MousePressed(evt);
            }
        });
        panelPaso3.add(siguientePaso3);
        siguientePaso3.setBounds(850, 390, 120, 30);

        jLabel64.setText("<html><li>D = 10 32 54 76</li></html>");
        panelPaso3.add(jLabel64);
        jLabel64.setBounds(640, 150, 170, 20);

        jLabel68.setText("<html><li>A = 67 45 23 01</li></html>");
        panelPaso3.add(jLabel68);
        jLabel68.setBounds(90, 150, 160, 20);

        jLabel70.setText("<html><li>C = 98 BA DC FE</li></html>");
        panelPaso3.add(jLabel70);
        jLabel70.setBounds(450, 150, 170, 20);

        jLabel71.setText("<html><li>B = EF CD AB 89</li></html>");
        panelPaso3.add(jLabel71);
        jLabel71.setBounds(270, 150, 160, 20);

        jLabel35.setText("<html>Se utiliza un registro de 128 bits (4 registros) que permite almacenar y mantener los resultados intermedios y final de la función hash. El registro se divide en cuatro secciones de 32 bits cada una, las cuales corresponden a las variables A, B, C y D que son inicializadas con los valores hexadecimales:</html>");
        panelPaso3.add(jLabel35);
        jLabel35.setBounds(30, 70, 990, 30);

        jLabel72.setText("<html><li>A = 01 23 45 67</li></html>");
        panelPaso3.add(jLabel72);
        jLabel72.setBounds(90, 270, 160, 20);

        jLabel73.setText("<html><li>B = 89 AB CD EF</li></html>");
        panelPaso3.add(jLabel73);
        jLabel73.setBounds(270, 270, 160, 20);

        jLabel74.setText("<html><li>C = FE DC BA 98</li></html>");
        panelPaso3.add(jLabel74);
        jLabel74.setBounds(450, 270, 170, 20);

        jLabel75.setText("<html><li>D = 76 54 32 10</li></html>");
        panelPaso3.add(jLabel75);
        jLabel75.setBounds(640, 270, 170, 20);

        MD5TabbedPane1.addTab("Paso 3 de 5", panelPaso3);

        panelPaso4i.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel17.setText("<html>La parte medular del algoritmo es una función de compresión que consta de cuatro rondas, las cuales tienen una estructura similar pero cada una utiliza operaciones distintas durante 16 iteraciones; cada operación realiza una función no lineal sobre tres de las variables a, b, c y d, y el resultado es sumado a la cuarta variable que no fue elegida, un sub-bloque del texto y una constante.</html>");
        panelPaso4i.add(jLabel17, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 90, 1180, 50));

        jLabel76.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel76.setText("Función de compresión MD5");
        panelPaso4i.add(jLabel76, new org.netbeans.lib.awtextra.AbsoluteConstraints(800, 140, -1, -1));

        jLabel69.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/md5/cuatroOperaciones.PNG"))); // NOI18N
        panelPaso4i.add(jLabel69, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 420, -1, 100));

        jLabel77.setText("<html>El mensaje se procesa en bloques de 512 bits a la vez a través de 16 bloques de 32 bits cada uno, para lo cual las cuatro variables de concatenación se copian en variables distintas: a=A; b=B; c=C; d=D</html>");
        panelPaso4i.add(jLabel77, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 50, 1180, 40));

        jLabel78.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/md5/funcionCompresionMd51.png"))); // NOI18N
        panelPaso4i.add(jLabel78, new org.netbeans.lib.awtextra.AbsoluteConstraints(620, 160, 600, 340));

        jLabel79.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel79.setText("Paso 4i: Procesamiento del mensaje - introducción teórica");
        panelPaso4i.add(jLabel79, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 20, -1, -1));

        jLabel81.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/md5/funcionesMd5.jpg"))); // NOI18N
        panelPaso4i.add(jLabel81, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, 180, 360, 160));

        jLabel82.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        jLabel82.setText("Operaciones no lineales usadas por cada ronda:");
        panelPaso4i.add(jLabel82, new org.netbeans.lib.awtextra.AbsoluteConstraints(50, 160, -1, -1));

        siguientePaso4i.setText("Siguiente");
        siguientePaso4i.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                siguientePaso4iMousePressed(evt);
            }
        });
        siguientePaso4i.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                siguientePaso4iActionPerformed(evt);
            }
        });
        panelPaso4i.add(siguientePaso4i, new org.netbeans.lib.awtextra.AbsoluteConstraints(1110, 520, 90, -1));

        jLabel8.setForeground(new java.awt.Color(0, 23, 255));
        jLabel8.setText("Ver Imagen");
        jLabel8.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jLabel8.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jLabel8.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jLabel8MousePressed(evt);
            }
        });
        panelPaso4i.add(jLabel8, new org.netbeans.lib.awtextra.AbsoluteConstraints(110, 380, -1, 20));

        jLabel9.setFont(new java.awt.Font("DejaVu Sans", 1, 12)); // NOI18N
        jLabel9.setText("<html>Si Mj representa el j-ésimo sub-bloque del mensaje (desde 0 hasta 15), y &lt;&lt;&lt; s representa un cambio circular a la izquierda de s bits (______________) , entonces las cuatro operaciones son:</html>");
        panelPaso4i.add(jLabel9, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 350, 450, 50));

        MD5TabbedPane1.addTab("Paso 4i de 5", panelPaso4i);

        panelPaso4ii.setLayout(null);

        jLabel26.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel26.setText("Paso 4: Procesamiento del mensaje");
        panelPaso4ii.add(jLabel26);
        jLabel26.setBounds(20, 10, 357, 22);

        jLabel19.setFont(new java.awt.Font("DejaVu Sans", 1, 12)); // NOI18N
        jLabel19.setText("Ver operaciones ejecutadas:");
        panelPaso4ii.add(jLabel19);
        jLabel19.setBounds(30, 400, 230, 20);

        jLabel16.setText("<html> <ul> <li>Cada ronda utiliza operaciones distintas durante 16 iteraciones</li><br><li>Cada operación realiza una función no lineal sobre tres de las variables a, b, c y d, y el resultado es sumado a la cuarta variable que no fue elegida, un sub-bloque del texto y una constante</li><br><li>A ese resultado se le aplica una rotación circular a la izquierda un número variable de bits y se suma el resultado a una de las variables a, b, c o d</li><br><li> Finalmente el resultado reemplaza a una de las variables a, b, c o d.</li><br><li>La salida de la cuarta ronda se suma a la entrada de la primera en una operación modular 2^32</li></ul> </html>");
        panelPaso4ii.add(jLabel16);
        jLabel16.setBounds(0, 190, 390, 200);

        buttonRonda1.setText("<html>Ronda 1<br> Iteración: 0 </html>");
        buttonRonda1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                buttonRonda1MousePressed(evt);
            }
        });
        panelPaso4ii.add(buttonRonda1);
        buttonRonda1.setBounds(500, 150, 110, 44);

        buttonRonda2.setText("<html>Ronda 2<br> Iteración: 0 </html>");
        buttonRonda2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                buttonRonda2MousePressed(evt);
            }
        });
        panelPaso4ii.add(buttonRonda2);
        buttonRonda2.setBounds(500, 240, 110, 40);

        buttonRonda3.setText("<html>Ronda 3<br> Iteración: 0 </html>");
        buttonRonda3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                buttonRonda3MousePressed(evt);
            }
        });
        panelPaso4ii.add(buttonRonda3);
        buttonRonda3.setBounds(500, 320, 110, 40);

        buttonRonda4.setText("<html>Ronda 4<br> Iteración: 0 </html>");
        buttonRonda4.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                buttonRonda4MousePressed(evt);
            }
        });
        panelPaso4ii.add(buttonRonda4);
        buttonRonda4.setBounds(500, 400, 110, 40);
        panelPaso4ii.add(salidaFinal);
        salidaFinal.setBounds(760, 480, 460, 20);

        jLabel11.setForeground(new java.awt.Color(0, 23, 255));
        jLabel11.setText("Operaciones Ronda 1");
        jLabel11.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jLabel11.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jLabel11.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jLabel11MousePressed(evt);
            }
        });
        panelPaso4ii.add(jLabel11);
        jLabel11.setBounds(50, 430, 150, 15);

        jLabel20.setForeground(new java.awt.Color(0, 23, 255));
        jLabel20.setText("Operaciones Ronda 2");
        jLabel20.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jLabel20.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jLabel20.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jLabel20MousePressed(evt);
            }
        });
        panelPaso4ii.add(jLabel20);
        jLabel20.setBounds(50, 450, 140, 15);

        jLabel21.setForeground(new java.awt.Color(0, 23, 255));
        jLabel21.setText("Operaciones Ronda 3");
        jLabel21.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jLabel21.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jLabel21.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jLabel21MousePressed(evt);
            }
        });
        panelPaso4ii.add(jLabel21);
        jLabel21.setBounds(50, 470, 135, 15);

        jLabel22.setForeground(new java.awt.Color(0, 23, 255));
        jLabel22.setText("Operaciones Ronda 4");
        jLabel22.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        jLabel22.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jLabel22.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jLabel22MousePressed(evt);
            }
        });
        panelPaso4ii.add(jLabel22);
        jLabel22.setBounds(50, 490, 140, 15);

        jLabel23.setText("La base del algoritmo es una función de compresión que consta de cuatro rondas de estructura similar");
        panelPaso4ii.add(jLabel23);
        jLabel23.setBounds(20, 40, 651, 15);

        buttonGroup1.add(jRadioButton2);
        jRadioButton2.setText("16");
        jRadioButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jRadioButton2MouseClicked(evt);
            }
        });
        panelPaso4ii.add(jRadioButton2);
        jRadioButton2.setBounds(220, 120, 50, 22);

        buttonGroup1.add(jRadioButton3);
        jRadioButton3.setText("64");
        jRadioButton3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jRadioButton3MouseClicked(evt);
            }
        });
        jRadioButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButton3ActionPerformed(evt);
            }
        });
        panelPaso4ii.add(jRadioButton3);
        jRadioButton3.setBounds(300, 120, 70, 22);

        buttonGroup1.add(jRadioButton4);
        jRadioButton4.setText("4");
        jRadioButton4.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jRadioButton4MouseClicked(evt);
            }
        });
        panelPaso4ii.add(jRadioButton4);
        jRadioButton4.setBounds(140, 120, 80, 22);

        jLabel30.setFont(new java.awt.Font("DejaVu Sans", 1, 14)); // NOI18N
        jLabel30.setText("<html>Seleccione una cantidad de pasos para seguir el proceso:</html>");
        panelPaso4ii.add(jLabel30);
        jLabel30.setBounds(20, 70, 390, 50);

        jLabel31.setFont(new java.awt.Font("DejaVu Sans", 1, 12)); // NOI18N
        jLabel31.setText("Repasando un poco:");
        panelPaso4ii.add(jLabel31);
        jLabel31.setBounds(30, 170, 150, 20);

        siguientePaso4ii.setText("Siguiente");
        siguientePaso4ii.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                siguientePaso4iiActionPerformed(evt);
            }
        });
        panelPaso4ii.add(siguientePaso4ii);
        siguientePaso4ii.setBounds(1080, 520, 110, 30);

        buttonGroup1.add(jRadioButton5);
        jRadioButton5.setText("1");
        jRadioButton5.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jRadioButton5MouseClicked(evt);
            }
        });
        panelPaso4ii.add(jRadioButton5);
        jRadioButton5.setBounds(60, 120, 70, 22);

        valoresLabel.setText("Valores iniciales:");
        panelPaso4ii.add(valoresLabel);
        valoresLabel.setBounds(640, 80, 110, 15);
        panelPaso4ii.add(valoresIniciales);
        valoresIniciales.setBounds(760, 80, 450, 15);

        jLabel36.setText("1");
        panelPaso4ii.add(jLabel36);
        jLabel36.setBounds(680, 170, 52, 10);

        labelSumaFinal.setText("Salida Final:");
        panelPaso4ii.add(labelSumaFinal);
        labelSumaFinal.setBounds(660, 480, 90, 15);

        jLabel37.setText("1");
        panelPaso4ii.add(jLabel37);
        jLabel37.setBounds(680, 130, 52, 10);

        jLabel38.setText("1");
        panelPaso4ii.add(jLabel38);
        jLabel38.setBounds(680, 190, 52, 10);

        jLabel39.setText("1");
        panelPaso4ii.add(jLabel39);
        jLabel39.setBounds(680, 150, 52, 10);

        jLabel40.setText("2");
        panelPaso4ii.add(jLabel40);
        jLabel40.setBounds(680, 210, 52, 10);

        jLabel41.setText("2");
        panelPaso4ii.add(jLabel41);
        jLabel41.setBounds(680, 230, 52, 15);

        jLabel42.setText("2");
        panelPaso4ii.add(jLabel42);
        jLabel42.setBounds(680, 250, 52, 15);

        jLabel43.setText("2");
        panelPaso4ii.add(jLabel43);
        jLabel43.setBounds(680, 270, 52, 20);

        jLabel44.setText("3");
        panelPaso4ii.add(jLabel44);
        jLabel44.setBounds(680, 290, 52, 20);

        jLabel45.setText("3");
        panelPaso4ii.add(jLabel45);
        jLabel45.setBounds(680, 310, 52, 20);

        jLabel46.setText("3");
        panelPaso4ii.add(jLabel46);
        jLabel46.setBounds(680, 330, 52, 20);

        jLabel47.setText("3");
        panelPaso4ii.add(jLabel47);
        jLabel47.setBounds(680, 355, 52, 15);

        jLabel48.setText("4");
        panelPaso4ii.add(jLabel48);
        jLabel48.setBounds(680, 380, 52, 10);

        jLabel49.setText("4");
        panelPaso4ii.add(jLabel49);
        jLabel49.setBounds(680, 400, 52, 10);

        jLabel50.setText("4");
        panelPaso4ii.add(jLabel50);
        jLabel50.setBounds(680, 420, 52, 10);

        jLabel51.setText("4");
        panelPaso4ii.add(jLabel51);
        jLabel51.setBounds(680, 440, 52, 10);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "Ronda", "A", "D", "C", "B"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setColumnSelectionAllowed(true);
        jTable1.setRowHeight(21);
        jTable1.getTableHeader().setReorderingAllowed(false);
        jScrollPane1.setViewportView(jTable1);
        jTable1.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        if (jTable1.getColumnModel().getColumnCount() > 0) {
            jTable1.getColumnModel().getColumn(0).setResizable(false);
        }

        panelPaso4ii.add(jScrollPane1);
        jScrollPane1.setBounds(640, 100, 580, 370);

        MD5TabbedPane1.addTab("Paso 4ii de 5", panelPaso4ii);

        panelPaso5.setLayout(null);

        jLabel25.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel25.setText("Paso 5: Obtención del hash de salida (message digest o resumen del mensaje)");
        panelPaso5.add(jLabel25);
        jLabel25.setBounds(12, 12, 793, 22);

        jLabel29.setText("<html>Al final de todos los ciclos, a, b, c y d son sumados a A, B, C y D respectivamente y el algoritmo continúa con el siguiente bloque de datos. Y después de que todos los bloques de 512 bits (cada uno) han sido procesados se obtiene la salida final, esto es, la concatenación de A, B, C y D que produce un bloque de 128 bits, llamado message digest o resumen del mensaje, que es una función de todos los bits de su mensaje. </html>");
        panelPaso5.add(jLabel29);
        jLabel29.setBounds(20, 40, 1120, 100);

        jLabel24.setText("<html>Sumando las variables iniciales A, B, C y D y las obtenidas luego del proceso del paso anterior, nos queda el siguiente resultado: </html>");
        panelPaso5.add(jLabel24);
        jLabel24.setBounds(20, 140, 950, 20);
        panelPaso5.add(sumaSalidaFinal);
        sumaSalidaFinal.setBounds(180, 230, 540, 30);

        jLabel18.setText("<html>Para el ejemplo ingresado, teniendo en cuenta que cada variable se guardan en little endian, obtenemos el siguiente resumen:</html>");
        panelPaso5.add(jLabel18);
        jLabel18.setBounds(20, 290, 805, 15);
        panelPaso5.add(hashSalida);
        hashSalida.setBounds(280, 340, 340, 20);
        panelPaso5.add(variablesEntrada);
        variablesEntrada.setBounds(180, 170, 540, 30);
        panelPaso5.add(variablesSalida);
        variablesSalida.setBounds(180, 200, 540, 30);

        jLabel5.setText("Variables iniciales:");
        panelPaso5.add(jLabel5);
        jLabel5.setBounds(20, 180, 120, 15);

        jLabel13.setText("Variables salida:");
        panelPaso5.add(jLabel13);
        jLabel13.setBounds(20, 210, 120, 15);

        jLabel27.setText("Suma final:");
        panelPaso5.add(jLabel27);
        jLabel27.setBounds(20, 240, 69, 15);

        MD5TabbedPane1.addTab("Paso 5 de 5", panelPaso5);

        add(MD5TabbedPane1);
        MD5TabbedPane1.setBounds(20, 60, 1250, 600);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("MD5 - Modo Aprender");
        add(jLabel1);
        jLabel1.setBounds(390, 10, 270, 22);

        getAccessibleContext().setAccessibleName("");
    }// </editor-fold>//GEN-END:initComponents

    private void siguientePaso3MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_siguientePaso3MousePressed
        sumaSalidaFinal.setVisible(false);
        salidaFinal.setVisible(false);
        MD5TabbedPane1.setEnabledAt(4, true);
        System.out.println("contenido button 6" + buttonRonda4);
        buttonRonda2.setVisible(false);
        buttonRonda3.setVisible(false);
        buttonRonda4.setVisible(false);
        MD5TabbedPane1.setSelectedIndex(4);
    }//GEN-LAST:event_siguientePaso3MousePressed

    private void adicionarLongitudActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_adicionarLongitudActionPerformed
        String msgAEncriptar = textMensaje.getText();

        try {
            if (!msgAEncriptar.equals("")) {
                String msgPadeado = MD5.textoAProcesar(msgAEncriptar, msgAEncriptar.length(), false);
                jLabel6.setText("<html><div style=\"background-color: white;\">"+msgPadeado+"</html>");
            }
        } catch (Exception ex) {
            Logger.getLogger(MD5Panel.class.getName()).log(Level.SEVERE, null, ex);
        }
        siguientePaso2.setVisible(true);
    }//GEN-LAST:event_adicionarLongitudActionPerformed

    private void siguientePaso2MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_siguientePaso2MousePressed
        MD5TabbedPane1.setEnabledAt(3, true);
        MD5TabbedPane1.setSelectedIndex(3);
    }//GEN-LAST:event_siguientePaso2MousePressed

    private void botonAdicionarBitsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAdicionarBitsActionPerformed
        String msgAEncriptar = textMensaje.getText();

        try {
            if (!msgAEncriptar.equals("")) {
                String msgPadeado = MD5.textoPadeado(msgAEncriptar, msgAEncriptar.length(), false);
                messageWithAditionalBits.setText("<html><div style=\"background-color: white;\">"+msgPadeado+"</html>");
            }
        } catch (Exception ex) {
            Logger.getLogger(MD5Panel.class.getName()).log(Level.SEVERE, null, ex);
        }
        siguientePaso1.setVisible(true);
    }//GEN-LAST:event_botonAdicionarBitsActionPerformed

    private void botonTextoABinarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonTextoABinarioActionPerformed
        String msgAEncriptar = textMensaje.getText();

        try {
            if (!msgAEncriptar.equals("")) {
                String msgBinario = MD5.textoEnBinario(msgAEncriptar, false);
                messageToBinary.setText("<html><div style=\"background-color: white;\">"+msgBinario+"</html>");
            }
        } catch (Exception ex) {
            Logger.getLogger(MD5Panel.class.getName()).log(Level.SEVERE, null, ex);
        }
        botonAdicionarBits.setVisible(true);
    }//GEN-LAST:event_botonTextoABinarioActionPerformed

    private void textMensajeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_textMensajeActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_textMensajeActionPerformed

    private void siguientePaso1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_siguientePaso1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_siguientePaso1ActionPerformed

    private void siguientePaso1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_siguientePaso1MousePressed
        MD5TabbedPane1.setEnabledAt(2, true);
        MD5TabbedPane1.setSelectedIndex(2);
        siguientePaso2.setVisible(false);
    }//GEN-LAST:event_siguientePaso1MousePressed

    private void comenzarIntroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comenzarIntroActionPerformed
        MD5TabbedPane1.setEnabledAt(1, true);
        MD5TabbedPane1.setSelectedIndex(1);
        botonAdicionarBits.setVisible(false);
        siguientePaso1.setVisible(false);
    }//GEN-LAST:event_comenzarIntroActionPerformed

    private void siguientePaso4iMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_siguientePaso4iMousePressed
       MD5TabbedPane1.setEnabledAt(5, true);
       MD5TabbedPane1.setSelectedIndex(5);
    }//GEN-LAST:event_siguientePaso4iMousePressed

    private void jLabel8MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel8MousePressed
         OperacionMd5Dialog ad = new OperacionMd5Dialog();
         ad.setVisible(true);
    }//GEN-LAST:event_jLabel8MousePressed
    
    public String getSelectedButtonText(ButtonGroup buttonGroup) {
        for (Enumeration<AbstractButton> buttons = buttonGroup.getElements(); buttons.hasMoreElements();) {
            AbstractButton button = buttons.nextElement();

            if (button.isSelected()) {
                return button.getText();
            }
        }
        return null;
    }
    
    private void siguientePaso4iActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_siguientePaso4iActionPerformed
            char chrTestData[] = new char[64];
            chrTestData = textMensaje.getText().toCharArray();
            md5.update(chrTestData, chrTestData.length);
            md5.md5final();
            siguientePaso4ii.setVisible(false);
            buttonRonda1.setVisible(false);
    }//GEN-LAST:event_siguientePaso4iActionPerformed

    private void jRadioButton5MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jRadioButton5MouseClicked
        seteoInicial();
    }//GEN-LAST:event_jRadioButton5MouseClicked

    private void siguientePaso4iiActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_siguientePaso4iiActionPerformed
            MD5TabbedPane1.setEnabledAt(6, true);
            MD5TabbedPane1.setSelectedIndex(6);
            variablesEntrada.setText(valoresIniciales.getText());
            variablesEntrada.setVisible(true);
            variablesSalida.setText(salidaFinal.getText());
            variablesSalida.setVisible(true);
            sumaSalidaFinal.setText(seteoSumaFinal());
            sumaSalidaFinal.setVisible(true);
            hashSalida.setText("<html><div style=\"background-color: white;\"><b>"+md5.toHexString().toString()+"</b></html>");
    }//GEN-LAST:event_siguientePaso4iiActionPerformed

    private void jRadioButton4MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jRadioButton4MouseClicked
        seteoInicial();
    }//GEN-LAST:event_jRadioButton4MouseClicked

    private void jRadioButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton3ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jRadioButton3ActionPerformed

    private void jRadioButton3MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jRadioButton3MouseClicked
        seteoInicial();
    }//GEN-LAST:event_jRadioButton3MouseClicked

    private void jRadioButton2MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jRadioButton2MouseClicked
        seteoInicial();
    }//GEN-LAST:event_jRadioButton2MouseClicked

    private void jLabel22MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel22MousePressed
        Ronda4Dialog ad = new Ronda4Dialog();
        ad.setVisible(true);
    }//GEN-LAST:event_jLabel22MousePressed

    private void jLabel21MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel21MousePressed
        Ronda3Dialog ad = new Ronda3Dialog();
        ad.setVisible(true);
    }//GEN-LAST:event_jLabel21MousePressed

    private void jLabel20MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel20MousePressed
        Ronda2Dialog ad = new Ronda2Dialog();
        ad.setVisible(true);
    }//GEN-LAST:event_jLabel20MousePressed

    private void jLabel11MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel11MousePressed
        Ronda1Dialog ad = new Ronda1Dialog();
        ad.setVisible(true);
    }//GEN-LAST:event_jLabel11MousePressed

    private void buttonRonda4MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_buttonRonda4MousePressed
        iteracionRonda4= iteracionRonda4 + (limitei * limitej);
        if (iteracionRonda4 <= 16){
            completarGrilla(limitei, limitej);
            buttonRonda4.setText("<html>Ronda 4 <br> Iteración: " + iteracionRonda4 + "</html>");
        }
        if (iteracionRonda4 == 16){
            buttonRonda4.setVisible(false);
            seteoSalidaProceso();
        }
    }//GEN-LAST:event_buttonRonda4MousePressed

    private void buttonRonda3MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_buttonRonda3MousePressed
        iteracionRonda3 = iteracionRonda3 + (limitei * limitej);
        if (iteracionRonda3 <= 16){
            completarGrilla(limitei, limitej);
            buttonRonda3.setText("<html>Ronda 3 <br> Iteración: "+iteracionRonda3+"</html>");
        }
        if (iteracionRonda3 == 16){
            buttonRonda3.setVisible(false);
            buttonRonda4.setVisible(true);
        }
    }//GEN-LAST:event_buttonRonda3MousePressed

    private void buttonRonda2MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_buttonRonda2MousePressed
        iteracionRonda2= iteracionRonda2 + (limitei * limitej);
        if (iteracionRonda2 <= 16){
            completarGrilla(limitei, limitej);
            buttonRonda2.setText("<html>Ronda 2 <br> Iteración: " + iteracionRonda2 + "</html>");
        }
        if (iteracionRonda2 == 16){
            buttonRonda2.setVisible(false);
            buttonRonda3.setVisible(true);
        }
    }//GEN-LAST:event_buttonRonda2MousePressed

    private void buttonRonda1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_buttonRonda1MousePressed
        iteracionRonda1= iteracionRonda1 + (limitei * limitej);
        seteoValoresIniciales();
        completarGrilla(limitei, limitej);
        if (iteracionRonda1 <= 16){
            buttonRonda1.setText("<html>Ronda 1 <br> Iteración: "+iteracionRonda1+"</html>");
        }
        if (iteracionRonda1 == 16){
            buttonRonda1.setVisible(false);
            buttonRonda2.setVisible(true);
        } else if (iteracionRonda1 == 64) {
            buttonRonda1.setVisible(false);
            buttonRonda2.setVisible(false);
            buttonRonda3.setVisible(false);
            buttonRonda4.setVisible(false);
            iteracionRonda1 = 16;
            iteracionRonda2 = 16;
            iteracionRonda3 = 16;
            iteracionRonda4 = 16;
            buttonRonda1.setText("<html>Ronda 1 <br> Iteración: " + iteracionRonda1 + "</html>");
            buttonRonda2.setText("<html>Ronda 2 <br> Iteración: " + iteracionRonda2 + "</html>");
            buttonRonda3.setText("<html>Ronda 3 <br> Iteración: " + iteracionRonda3 + "</html>");
            buttonRonda4.setText("<html>Ronda 4 <br> Iteración: " + iteracionRonda4 + "</html>");
            seteoSalidaProceso();
        }
    }//GEN-LAST:event_buttonRonda1MousePressed

    private void seteoValoresIniciales() {
        String inicial = "";
        inicial += " A = " + MD5.getMatrizValores()[0][0] + "    ";
        inicial += " D = " + MD5.getMatrizValores()[3][0] + "    ";
        inicial += " C = " + MD5.getMatrizValores()[2][0] + "    ";
        inicial += " B = " + MD5.getMatrizValores()[1][0];
        valoresIniciales.setText(inicial);
    }

    private void seteoSalidaProceso() {
        String salida = "";
        salida += "AA = " + MD5.getMatrizValores()[0][16] + "   ";
        salida += "DD = " + MD5.getMatrizValores()[3][16] + "   ";
        salida += "CC = " + MD5.getMatrizValores()[2][16] + "   ";
        salida += "BB = " + MD5.getMatrizValores()[1][16];
        salidaFinal.setText(salida);
        salidaFinal.setVisible(true);
        siguientePaso4ii.setVisible(true);
    }
    private String seteoSumaFinal() {
        String sumaFinal = "";
        sumaFinal += " A = " + MD5.getMatrizValores()[0][17] + "    ";
        sumaFinal += " D = " + MD5.getMatrizValores()[3][17] + "    ";
        sumaFinal += " C = " + MD5.getMatrizValores()[2][17] + "    ";
        sumaFinal += " B = " + MD5.getMatrizValores()[1][17];
        return sumaFinal;
    }
    private void completarGrilla(int limiteColumna, int limiteFila) {
        int count = 0;
        while (janterior < 16) {
            while (ianterior < 4){
                jTable1.setValueAt(MD5.getMatrizValores()[ianterior][janterior+1], janterior, ianterior+1);
                count++;
                ianterior++;
                if (count >= limiteColumna*limiteFila){
                    break;
                }
            }
            if (ianterior == 4){
                janterior++;
                ianterior=0;
            }
            if (count >= limiteColumna*limiteFila){
                    break;
            }
        }
    }

    private void seteoInicial() throws NumberFormatException {
            for (int j = 0; j < 16; j++) {
                for (int i = 1; i < 5; i++) {
                    jTable1.setValueAt("", j, i);     
                }
            }
            pasos = Integer.parseInt(getSelectedButtonText(buttonGroup1));
            switch (pasos){
                case 1: limitei = 4; limitej = 16;
                    break;
                case 4: limitei = 4; limitej = 4;
                    break;
                case 16: limitei = 4; limitej = 1;
                    break;
                case 64: limitei = 1; limitej = 1;
                    break;
            }
        buttonRonda1.setVisible(true);
        buttonRonda2.setVisible(false);
        buttonRonda3.setVisible(false);
        buttonRonda4.setVisible(false);
        iteracionRonda1 = 0;
        iteracionRonda2 = 0;
        iteracionRonda3 = 0;
        iteracionRonda4 = 0;
        buttonRonda1.setText("<html>Ronda 1 <br> Iteración: " + iteracionRonda1 + "</html>");
        buttonRonda2.setText("<html>Ronda 2 <br> Iteración: " + iteracionRonda2 + "</html>");
        buttonRonda3.setText("<html>Ronda 3 <br> Iteración: " + iteracionRonda3 + "</html>");
        buttonRonda4.setText("<html>Ronda 4 <br> Iteración: " + iteracionRonda4 + "</html>");
        salidaFinal.setText("");
        ianterior = 0;
        janterior = 0;
    }
    
    int pasos= 0; 
    protected int limitei= 0; 
    protected int limitej= 0;
    MD5 md5 = new MD5();
    int ianterior = 0; int janterior = 0;
    int iteracionRonda1 = 0;    int iteracionRonda2 = 0;    int iteracionRonda3 = 0;    int iteracionRonda4 = 0;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel IntroMD5;
    private javax.swing.JTabbedPane MD5TabbedPane1;
    private javax.swing.JButton adicionarLongitud;
    private javax.swing.JButton botonAdicionarBits;
    private javax.swing.JButton botonTextoABinario;
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JButton buttonRonda1;
    private javax.swing.JButton buttonRonda2;
    private javax.swing.JButton buttonRonda3;
    private javax.swing.JButton buttonRonda4;
    private javax.swing.JButton comenzarIntro;
    private javax.swing.JLabel hashSalida;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel19;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel21;
    private javax.swing.JLabel jLabel22;
    private javax.swing.JLabel jLabel23;
    private javax.swing.JLabel jLabel24;
    private javax.swing.JLabel jLabel25;
    private javax.swing.JLabel jLabel26;
    private javax.swing.JLabel jLabel27;
    private javax.swing.JLabel jLabel28;
    private javax.swing.JLabel jLabel29;
    private javax.swing.JLabel jLabel30;
    private javax.swing.JLabel jLabel31;
    private javax.swing.JLabel jLabel32;
    private javax.swing.JLabel jLabel33;
    private javax.swing.JLabel jLabel34;
    private javax.swing.JLabel jLabel35;
    private javax.swing.JLabel jLabel36;
    private javax.swing.JLabel jLabel37;
    private javax.swing.JLabel jLabel38;
    private javax.swing.JLabel jLabel39;
    private javax.swing.JLabel jLabel40;
    private javax.swing.JLabel jLabel41;
    private javax.swing.JLabel jLabel42;
    private javax.swing.JLabel jLabel43;
    private javax.swing.JLabel jLabel44;
    private javax.swing.JLabel jLabel45;
    private javax.swing.JLabel jLabel46;
    private javax.swing.JLabel jLabel47;
    private javax.swing.JLabel jLabel48;
    private javax.swing.JLabel jLabel49;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel50;
    private javax.swing.JLabel jLabel51;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel64;
    private javax.swing.JLabel jLabel68;
    private javax.swing.JLabel jLabel69;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel70;
    private javax.swing.JLabel jLabel71;
    private javax.swing.JLabel jLabel72;
    private javax.swing.JLabel jLabel73;
    private javax.swing.JLabel jLabel74;
    private javax.swing.JLabel jLabel75;
    private javax.swing.JLabel jLabel76;
    private javax.swing.JLabel jLabel77;
    private javax.swing.JLabel jLabel78;
    private javax.swing.JLabel jLabel79;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel81;
    private javax.swing.JLabel jLabel82;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JRadioButton jRadioButton3;
    private javax.swing.JRadioButton jRadioButton4;
    private javax.swing.JRadioButton jRadioButton5;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JLabel labelAdicionarBits;
    private javax.swing.JLabel labelConvertirMensajeABin;
    private javax.swing.JLabel labelInformativoPaso1;
    private javax.swing.JLabel labelIntroducirMensaje;
    private javax.swing.JLabel labelSumaFinal;
    private javax.swing.JLabel labelTextoHeader;
    private javax.swing.JLabel messageToBinary;
    private javax.swing.JLabel messageWithAditionalBits;
    private javax.swing.JPanel panelPaso1;
    private javax.swing.JPanel panelPaso2;
    private javax.swing.JPanel panelPaso3;
    private javax.swing.JPanel panelPaso4i;
    private javax.swing.JPanel panelPaso4ii;
    private javax.swing.JPanel panelPaso5;
    private javax.swing.JLabel salidaFinal;
    private javax.swing.JButton siguientePaso1;
    private javax.swing.JButton siguientePaso2;
    private javax.swing.JButton siguientePaso3;
    private javax.swing.JButton siguientePaso4i;
    private javax.swing.JButton siguientePaso4ii;
    private javax.swing.JLabel sumaSalidaFinal;
    private javax.swing.JTextField textMensaje;
    private javax.swing.JLabel valoresIniciales;
    private javax.swing.JLabel valoresLabel;
    private javax.swing.JLabel variablesEntrada;
    private javax.swing.JLabel variablesSalida;
    // End of variables declaration//GEN-END:variables
}
